//
// AOE 网
// Created by 麻再挺 on 2021/12/17.
//

#ifndef DATA_STRUCTURE_C_AOE_H
#define DATA_STRUCTURE_C_AOE_H
#include <stdio.h>
#include <stdlib.h>
#include "graph_constant.h"
#include "./../stack_queue/stack.h"

// 结点
typedef struct AOEArcNode {
    // 邻接点在数组中的位置下标
    int idx;
    // 指向下一个邻接点的指针
    struct AOEArcNode *nextArc;
    VertexType dut;
} AOEArcNode;

// 存储各链表头结点的数组
typedef struct AOENode {
    // 顶点的数据域
    VertexType data;
    // 指向邻接点的指针
    AOEArcNode *firstArc;
} AOENode, AOEAdjList[MAX_VERTEX_NUM];

typedef struct {
    // 图中顶点及各邻接点数组
    AOEAdjList vertices;
    // 记录图中顶点数和边或弧数
    int vexNum, arcNum;
} AOEGraph;

/**
 * 创建 AOE 网
 * @param g 网
 */
void CreateAOE(AOEGraph **g);

/**
 * 拓扑排序, AOE网
 * @param g 图
 * @return
 */
bool AOETopoLogicalOrder(AOEGraph *g);

/**
 * 计算最早发生时间, 最晚发生时间和关键路径
 * @param g 网
 */
void CriticalPath(AOEGraph *g);

#endif //DATA_STRUCTURE_C_AOE_H
